package com.fenqing.leetcode.code.t300_400;

import com.fenqing.annotations.Execute;
import com.fenqing.core.Topic;

/**
 * @author fenqing
 */
public class Topic374 extends Topic {

    private final int randomNum = 1702766719;

    /**
     * 构造器
     *
     * @param input 输入
     */
    public Topic374(String input) {
        super(input);
        Integer object = this.getObject(0);
        //randomNum = new Random().nextInt(object);
    }

    /**
     * 猜数字游戏的规则如下：
     * 每轮游戏，我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
     * 如果你猜错了，我会告诉你，你猜测的数字比我选出的数字是大了还是小了。
     * 你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果，返回值一共有 3 种可能的情况（-1，1 或 0）：
     * -1：我选出的数字比你猜的数字小 pick < num
     * 1：我选出的数字比你猜的数字大 pick > num
     * 0：我选出的数字和你猜的数字一样。恭喜！你猜对了！pick == num
     * 返回我选出的数字。
     * 示例 1：
     * 输入：n = 10, pick = 6
     * 输出：6
     * 示例 2：
     * 输入：n = 1, pick = 1
     * 输出：1
     * 示例 3：
     * 输入：n = 2, pick = 1
     * 输出：1
     * 示例 4：
     * 输入：n = 2, pick = 2
     * 输出：2
     * @param n n
     * @return n
     */
    @Execute
    public int guessNumber(int n) {
        int p = 1, q = n;
        while (p < q) {
            int mid = (int) (((long)p + (long)q) / 2);
            int num = guess(mid);
            if (num == 0) {
                return mid;
            } else if (num < 0) {
                q = mid;
            } else {
                p = mid + 1;
            }
        }
        return p;
    }

    int guess(int num){
        if (num == this.randomNum) {
            return 0;
        } else if (num < this.randomNum) {
            return 1;
        } else {
            return -1;
        }
    }

    public static void main(String[] args) {
        Topic374 topic374 = new Topic374("2126753390");
        System.out.println("randomNum:" + topic374.randomNum);
        int run = topic374.run();
        System.out.println(run);
    }

}
